import { assert, assertObject, assertString, assertArray } from './assert'

/**
 * 将一个驼峰大小写字符串转换为横线分隔字符串。
 *
 * @param src 要转换的字符串，形如 '`updateDatabaseTable`'。
 * @return 转换后的字符串，形如 '`update-database-table`'
 */
export function camelToDash(src: string): string {
    if (src[0] === '-')
        return src

    const result: string[] = []
    let i = 0, j = 0

    for (const c of src) {
        if (c >= 'A' && c <= 'Z') {
            if (i < j)
                result.push(src.slice(i, j))
            result.push('-')
            result.push(c.toLocaleLowerCase())
            i = j + 1
        }
        j++
    }
    if (i < j)
        result.push(src.slice(i))

    return result.join('')
}

/**
 * 将一个横线份额字符串转换为驼峰大小写字符串。
 * 
 * @param src 要转换的字符串，形如 '`update-database-table`' 
 * @return 转换后的字符串，形如 '`updateDatabaseTable`'
 */
export function dashToCamel(src: string): string {
    if (src[0] === '-')
        return src

    const result: string[] = []
    const words = src.split('-')
    
    result.push(words[0]!)
    for (let i = 1; i < words.length; i++) {
        const w = words[i]!
        if (w.length > 0)
            result.push(w[0]!.toUpperCase(), w.substring(1))
    }

    return result.join('')
}


/**
 * 为 String 类增加快捷方法。
 */
declare global {
    interface String {
        camelToDash(): string
        dashToCamel(): string
    }
}
Object.assign(String.prototype, {
    /**
     * 将一个驼峰大小写字符串转换为横线分隔字符串。
     *
     * @return {string} 转换后的字符串，形如 '`update-database-table`'
     */
    camelToDash: function(): string {
        return camelToDash(this as unknown as string)
    },
    /**
     * 将一个横线份额字符串转换为驼峰大小写字符串。
     *
     * @return {string} 转换后的字符串，形如 '`updateDatabaseTable`'
     */
    dashToCamel: function(): string {
        return dashToCamel(this as unknown as string)
    },
})
